5.09. Иерархия исключений в Kotlin
Иерархия исключений в Kotlin
В Kotlin нет собственной иерархии исключений — он полностью использует модель исключений Java, поскольку компилируется в байт-код JVM (или в нативный код/JS с соответствующими адаптациями). На платформе JVM все исключения Kotlin являются подклассами java.lang.Throwable, как и в Java.
Однако Kotlin вносит семантические изменения:
- Все исключения в Kotlin непроверяемые (unchecked), даже если они наследуются от
java.lang.Exception. - Нет ключевого слова
throwsв сигнатурах функций. - Нет необходимости объявлять или перехватывать исключения.
Иерархия исключений в Kotlin (на JVM)
Корневой класс:
kotlin.Throwable— псевдоним дляjava.lang.Throwable.
Основные категории:
-
kotlin.Exception— псевдоним дляjava.lang.Exception.
Включает все стандартные исключения, такие как:IllegalArgumentExceptionIllegalStateExceptionNullPointerExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException
ArithmeticExceptionClassCastExceptionNumberFormatExceptionIOExceptionи его подклассы (например,FileNotFoundException)- и другие исключения из
java.lang,java.io,java.utilи т.д.
-
kotlin.Error— псевдоним дляjava.lang.Error.
Используется для фатальных ошибок времени выполнения:OutOfMemoryErrorStackOverflowErrorNoClassDefFoundErrorAssertionError- и др.
Специфичные исключения Kotlin (встроенные в стандартную библиотеку Kotlin)
Эти исключения определены в пакете kotlin и предназначены для использования в идиоматичном Kotlin-коде:
kotlin.IllegalArgumentException— выбрасывается при передаче недопустимого аргумента (например, черезrequire()).kotlin.IllegalStateException— выбрасывается при нарушении состояния объекта (например, черезcheck()).kotlin.NullPointerException— возникает при разыменованииnull(например, при использовании оператора!!).kotlin.IndexOutOfBoundsException— выбрасывается при выходе за границы коллекции или массива.kotlin.ArithmeticException— например, при делении на ноль.kotlin.TypeCastException— при неудачном приведении типа (as).kotlin.NoSuchElementException— например, при вызове.first()на пустой коллекции.kotlin.UnsupportedOperationException— при вызове не поддерживаемой операции (например, изменение неизменяемого списка).
Все эти исключения — алиасы соответствующих классов Java (
java.lang.*), но используются в контексте Kotlin-стандартной библиотеки.
Особенности:
-
Нет проверяемых исключений: даже если функция на Java помечена как
throws IOException, в Kotlin её можно вызывать безtry-catchили объявленияthrows. -
Функции-помощники: Kotlin предоставляет встроенные функции для генерации исключений:
error(message)→IllegalStateExceptionrequire(condition)→IllegalArgumentExceptioncheck(condition)→IllegalStateExceptionTODO()→NotImplementedError(подклассRuntimeException)
-
NotImplementedError: специфичное исключение Kotlin, используемое по умолчанию в заглушкахTODO(). Наследуется отjava.lang.RuntimeException.
Примеры типичных исключений в Kotlin-коде:
listOf(1, 2, 3)[10] // IndexOutOfBoundsException
null!! // NullPointerException
"abc".toInt() // NumberFormatException
listOf<Int>().first() // NoSuchElementException
TODO("not implemented") // NotImplementedError
На других платформах:
- Kotlin/Native: использует собственную иерархию исключений, но сохраняет совместимость по именам (
kotlin.Exception,kotlin.Errorи т.д.). Проверяемых исключений также нет. - Kotlin/JS: исключения маппятся на JavaScript-ошибки (
Error,TypeErrorи т.д.), но с сохранением Kotlin-интерфейса.
Таким образом, список типов исключений в Kotlin совпадает с Java на JVM, но с ключевым отличием: все исключения считаются непроверяемыми, а стандартная библиотека Kotlin активно использует подмножество java.lang.* исключений для своих встроенных функций.